36c36,46
<   op fun_->_ : VarList Exp -> Exp [format (b o b no++i n--)] .
---
>   sort ParamType .
>   sort ParamVar .
>   op __ : ParamType Var -> ParamVar [prec 30 format (r o d)] .
> 
>   sort ParamVarList .
>   subsort ParamVar < ParamVarList .
>   op _,_ : ParamVarList ParamVarList -> ParamVarList [assoc id: .] .
>   op . : -> ParamVarList .
> 
> 
>   op fun_->_ : ParamVarList Exp -> Exp [format (b o b no++i n--)] .
40c50,51
<   ops let letrec : VarList ExpList Exp -> Exp [format (b o)] .
---
>   op let : ParamVarList ExpList Exp -> Exp [format (b o)] .
>   op letrec : VarList ExpList Exp -> Exp [format (b o)] .
140c151
<   op exp : Exp -> K [memo] .
---
>   op exp : Exp -> K .
196c207
<   var V V' : Val . var Vl : ValList .
---
>   var V V' : Val . var Vl : ValList . var Pv : ValList .
201c212
<   eq valList(V) -> kv(Kel,Vl) = kv(Kel,Vl,V) .
---
>   eq valList(Pv) -> kv(Kel,Vl) = kv(Kel,Vl,Pv) .
229,230c240,241
<   eq k(valList(V) -> restore(Env) -> K) env(Env') 
<    = k(valList(V) -> K) env(Env) . 
---
>   eq k(valList(Vl) -> restore(Env) -> K) env(Env') 
>    = k(valList(Vl) -> K) env(Env) . 
236c247
<   var A1 A2 : Exp . var Env : Env .
---
>   var A1 A2 : Exp . var Env : Env . var V : Val . var L : Loc .
238,239c249,250
<   rl k(exp(X) -> K) env(Env) store(Store) 
<    => k(valList(Store[Env[X]]) -> K) env(Env) store(Store) .
---
>   rl k(exp(X) -> K) env(Env (X,L)) store(Store (L,V)) 
>    => k(valList(V) -> K) env(Env (X,L)) store(Store (L,V)) .
294a306,397
> 
> mod PARAMETER-PASSING-STYLE is
>   including K-STATE .
>   op expP : ParamType K -> K .
> 
>   op expPList : ParamVarList ExpList -> KList .
>   
>   var P : ParamType . var Pxl : ParamVarList . var X : Var . 
>   var E : Exp . var El : ExpList . 
> 
>   eq expPList(((P X),Pxl),E,El) = expP(P,exp(E)),expPList(Pxl,El) .
>   eq expPList(.,.) = . .
>   
>   op bindP : ParamVarList -> Kitem .
> 
>   eq valList(.) -> bindP(.) = nothing .
> 
>   sort PreVal .
>   subsort Val < PreVal < ValList .
>   op `(_`,_`) : Loc PreVal -> Store [ditto] .
> endm
> 
> mod CALL-BY-VALUE is
>   including PARAMETER-PASSING-STYLE .
>   op val : -> ParamType .
>   var K : K . var V : Val . var Vl : ValList . var Pxl : ParamVarList .
>   var X : Var . var Env : Env . var Store : Store . var L : Loc .
> 
>   eq expP(val,K) = K .
>   eq k(valList(Vl,V) -> bindP(Pxl,val X) -> K)
>      env(Env) store(Store) nextLoc(L)
>    = k(valList(Vl) -> bindP(Pxl) -> K) 
>      env(Env[X <- L]) store(Store (L,V)) nextLoc(next(L)) .
> endm
> 
> mod CALL-BY-NAME is
>   including PARAMETER-PASSING-STYLE .
>   including K-BASIC .
>   op name : -> ParamType .
>   op name : K Env -> PreVal .
>   var K Ke : K . var Env Enve : Env . var X : Var . var L : Loc . 
>   var Store : Store . var Vl : ValList . var Pv : PreVal . 
>   var Pxl : ParamVarList . 
> 
>   eq k(expP(name,Ke) -> K) env(Env)
>    = k(valList(name(Ke,Env)) -> K) env(Env) .
> ---  rl k(exp(X) -> K) env(Env (X,L)) 
> ---     store(Store (L,name(Ke,Enve)))
> ---  => ...
>   eq k(valList(Vl,Pv) -> bindP(Pxl,name X) -> K)
>      env(Env) store(Store) nextLoc(L)
>    = k(valList(Vl) -> bindP(Pxl) -> K) 
>      env(Env[X <- L]) store(Store (L,Pv)) nextLoc(next(L)) .
> endm
> 
> mod CALL-BY-NEED is
>   including PARAMETER-PASSING-STYLE .
>   including K-BASIC .
>   op need : -> ParamType .
>   op need : K Env -> PreVal .
>   op rewrite : Loc -> Kitem .
>   var K Ke : K . var Env Enve : Env . var X : Var . var L : Loc . 
>   var Store : Store . var Vl : ValList . var Pv : PreVal . 
>   var Pxl : ParamVarList . var V : Val .
> 
>   eq k(expP(need,Ke) -> K) env(Env)
>    = k(valList(need(Ke,Env)) -> K) env(Env) .
> ---  rl k(exp(X) -> K) env(Env (X,L)) 
> ---     store(Store (L,need(Ke,Enve)))
> ---  => ...
>   eq k(valList(Vl,Pv) -> bindP(Pxl,need X) -> K)
>      env(Env) store(Store) nextLoc(L)
>    = k(valList(Vl) -> bindP(Pxl) -> K) 
>      env(Env[X <- L]) store(Store (L,Pv)) nextLoc(next(L)) .
> 
>   eq k(valList(V) -> rewrite(L) -> K) store(Store (L,Pv))
>    = k(valList(V) -> K) store(Store (L,V)) .
> endm
> 
> mod CALL-BY-REF is
>   including PARAMETER-PASSING-STYLE . 
>   op ref : -> ParamType .
>   op ref : Loc -> PreVal .
>   var X : Var . var K : K . var Env : Env . var Vl : ValList .
>   var L : Loc . var Pxl : ParamVarList .
> 
> ---  rl k(expP(ref,exp(X)) -> K) env(Env)
> ---  => ...
> ---  eq k(valList(Vl,ref(L)) -> bindP(Pxl,ref X) -> K) env(Env)
> ---   = ...
> endm
> 
295a399
>   including PARAMETER-PASSING-STYLE .
297,298c401,402
<   op closure : VarList K Env -> Val .
<   var Xl : VarList . var E : Exp . var El : ExpList . var X : Var .
---
>   op closure : ParamVarList K Env -> Val .
>   var Pxl : ParamVarList . var E : Exp . var El : ExpList . var X : Var .
302,305c406,409
<   eq k(exp(fun Xl -> E) -> K) env(Env) 
<    = k(valList(closure(Xl,exp(E),Env)) -> K) env(Env) .
<   op app : -> Kitem .
<   eq exp(E(El)) = kList(exp(E),expList(El)) -> app .
---
>   eq k(exp(fun Pxl -> E) -> K) env(Env) 
>    = k(valList(closure(Pxl,exp(E),Env)) -> K) env(Env) .
>   op app : ExpList -> Kitem .
>   eq exp(E(El)) = exp(E) -> app(El) .
310c414
<   rl k(valList(closure(Xl,K,Env),Vl) -> app -> K') 
---
>   rl k(valList(closure(Pxl,K,Env)) -> app(El) -> K') 
312,313c416,418
<   => k(valList(Vl) -> bind(Xl) -> K -> popFstack) 
<      control(fstack((K',Env',C) -> FS) C) env(Env) .
---
>   => k(kList(expPList(Pxl,El)) -> restore(Env) -> 
>        bindP(Pxl) -> K -> popFstack) 
>      control(fstack((K',Env',C) -> FS) C) env(Env') .
326c431,432
<   var Env Env' : Env . var K : K . var Xl : VarList . var El : ExpList .
---
>   including PARAMETER-PASSING-STYLE .
>   var Env Env' : Env . var K : K . var Pxl : ParamVarList . var El : ExpList .
328,329c434,435
<   rl k(exp(let(Xl,El,E)) -> K) env(Env)
<   => k(kList(expList(El)) -> bind(Xl) -> exp(E) -> restore(Env) -> K) 
---
>   rl k(exp(let(Pxl,El,E)) -> K) env(Env)
>   => k(kList(expPList(Pxl,El)) -> bindP(Pxl) -> exp(E) -> restore(Env) -> K) 
331a438
>   var Xl : VarList .
431a539,542
>   including CALL-BY-VALUE .
>   including CALL-BY-REF .
>   including CALL-BY-NAME .
>   including CALL-BY-NEED .
453a565,566
> --- Sanity tests - see whether call-by-value still works as should.
> 
468c581
< rew < let(x,# 5,print(x)),. > .
---
> rew < let(val x,# 5,print(x)),. > .
470c583
< rew < (fun x -> print(x))(# 5),. > .
---
> rew < (fun val x -> print(x))(# 5),. > .
472c585
< rew < letrec(f,fun x -> (if x == # 0 then # 0 else (# 1 + (f(x / 
---
> rew < letrec(f,fun val x -> (if x == # 0 then # 0 else (# 1 + (f(x / 
476c589
< rew < letrec('max,fun l -> 
---
> rew < letrec('max,fun val l -> 
478c591
<          let(x,('max(cdr(l))), 
---
>          let(val x,('max(cdr(l))), 
483c596
< rew < letrec('len,fun l -> (if null?(l) then # 0 else (# 1 + 
---
> rew < letrec('len,fun val l -> (if null?(l) then # 0 else (# 1 + 
489c602
< rew < (try let((x,y),(read(),read()),if y == # 0 then throw(x) else 
---
> rew < (try let((val x,val y),(read(),read()),if y == # 0 then throw(x) else 
492c605
< rew < (try let((x,y),(read(),read()),if y == # 0 then throw(x) else 
---
> rew < (try let((val x,val y),(read(),read()),if y == # 0 then throw(x) else 
495c608
< rew < let ((x,y),(read(),read()),
---
> rew < let ((val x,val y),(read(),read()),
504c617
< rew < let ((x,y),(read(),read()),
---
> rew < let ((val x,val y),(read(),read()),
511c624
< rew < let (x,read(),for( skip ; true ; x := read()) ((if x <= # 0 then 
---
> rew < let (val x,read(),for( skip ; true ; x := read()) ((if x <= # 0 then 
514c627,646
< quit
---
> 
> ***> this is functionality you need to implement 
> 
> rew < let (val x,read(), let(ref y,x,((y := y + # 1) ; print(x)))),4 > .
> ***> should be 5
> 
> rew < let (val x,read(),let(name y,(x := x + # 1) ; x,print(y + y))),1 > .
> ***> should be 5
> 
> --- homework example
> 
> rew < let (val x,read(),let(need y,(x := x + x) ; x, print(x + y + y))),1 > .
> ***> should be 5
> 
> rew < let (val x,read(),let(val y,(x := x + x) ; x,print(x + y + y))),1 > .
> ***> should be 6
> 
> rew < let (val x,read(),let(name y,(x := x + x) ; x,print(x + y + y))),1 > .
> ***> should be 7
> 
